The term upgrading a software application generally refers to the process of replacing an existing version of the software application with a newer version, adding a new version of the software application where none previously existed, or somehow changing an existing version of the software application to a newer different version. A software upgrade may be performed for various reasons such as to add one or more features, remove one or more features, modify one or more features in an existing version of the software, remove bugs or errors, improve the software efficiency, and other reasons. An upgrade is generally performed to enhance the performance of a software application.
Many modern computing environments typically include a framework of multiple heterogeneous software applications, which may be developed by different third-party entities. The applications may run on or be hosted by multiple hosts in a distributed environment. The process of upgrading such applications is quite complicated due to factors such as the number of applications that need to be upgraded, the distributed nature of the applications, potential dependencies between the applications, customized upgrade requirements for individual applications, complication caused by the multiple hosts involved in the upgrade process and their configurations, and several other factors. Conventional upgrade systems struggle with such software upgrades and many times the upgrades have to be controlled and/or managed manually.
Given the complexity of performing software upgrades in a heterogeneous distributed computing environment, some software upgrade systems use checkpoints to orchestrate the upgrade process. For example, “Prevayler” open source software (http://prevalyler.org/) provided by the Maven project provides an open source object persistence library that provides a thread-safe lightweight checkpointing solution for performing software upgrades. Prevayler is an implementation of the Prevalent System design pattern, in which business objects are kept live in memory and transactions are journaled for system recovery. Prevayler however only provides thread-safe checkpointing for a single Prevayler instance or process running on one host. When multiple Prevayler instances need to be used concurrently by multiple upgrade processes spanning different hosts, thread-safe solution can no longer guarantee the persistence. Consequently, Prevayler cannot be used in a multi-application multi-host environment and does not solve concurrency issues caused by multiple writing and reading application instances in a multi-host environment. A writing application instance tries to insert data to or update the transaction record, whereas a reading application instance tries to read data from the transaction record.
Some upgrade implementations use a database to provide persistence when coordinating upgrade activities among multiple hosts. However a database solution is too big and heavy, and requires high development efforts and high operating efforts. Furthermore, when upgrade flows have to be coordinated among different hosts, providing accessibility to a centralized database is typically not possible. Additionally, uninterrupted connectivity to any centralized database throughout the entire upgrade process (e.g., which could be spread over a long period of time, even several days) cannot be ensured.